﻿#define _CRT_SECURE_NO_WARNINGS

//#include <stdio.h>
//
//int main()
//{
//	printf("Hello World!\n");
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//int main()
//{
//	cout << "Hello World\n" << endl;
//	//endl : end line
//	return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//
////域
//namespace a
//{
//	int rand = 10;
//}
//
//int main()
//{
//	//格式字符串“%d”需要类型“int”的参数，但可变参数 1 拥有了类型“int (__cdecl *)(void)”
//	printf("%d\n", rand);
//	//232203296
//	printf("%p\n", rand);	
//	//00007FFD0DD72420
//	return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//
////域
//namespace a
//{
//	int rand = 10;
//}
//
//int m = 0;
//
//int main()
//{
//	printf("%d\n", a::rand);	//10
//	int m = 1;
//	printf("%d ", m);	//1
//	//::域作用限定符
//	printf("%d ", ::m);	//0
//	return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//
////域
//namespace a
//{
//	//命名空间中可以定义变量/函数/类型
//	int rand = 10;
//
//	int Add(int left, int right)
//	{
//		return left + right;
//	}
//
//	struct Node
//	{
//		struct Node* next;
//		int val;
//	};
//}
//
//int m = 0;
//
//int main()
//{
//	printf("%d\n", a::Add(1, 1));	//2
//
//	struct a::Node p1;
//	p1.val = 6;
//	printf("%d\n", p1.val);	//6
//
//	printf("%d\n", a::rand);	//10
//	int m = 1;
//	printf("%d ", m);	//1
//	//::域作用限定符
//	printf("%d ", ::m);	//0
//	return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//
////域
//namespace a
//{
//	namespace x
//	{
//		int rand = 1;
//	}
//	
//	namespace y
//	{
//		int rand = 2;
//	}
//}
//
//int m = 0;
//
//int main()
//{
//	printf("%d\n", a::x::rand);	//1
//	printf("%d\n", a::y::rand);	//2
//}

//#include <stdio.h>
//
//namespace s
//{
//	int a = 0;
//	int b = 1;
//}
//
////指定命名空间访问
//int main()
//{
//	printf("%d\n", s::a);
//	return 0;
//}
//
////using将命名空间中某个成员展开
//using s::b;
//int main()
//{
//	//printf("%d\n", a); 报错：a未声明
//	printf("%d\n", b);
//	return 0;
//}
//
//////展开命名空间中全部成员
//using namespace s;
//int main()
//{
//	printf("%d\n", a);
//	printf("%d\n", b);
//	return 0;
//}

//#include <iostream>
//
//using namespace std;
//int main()
//{
//	int i = 1;
//	int j = -1;
//	//输出
//	std::cout << i << std::endl; //1
//	std::cout << j << std::endl; //-1
//
//	int a = 0;
//	double b = 0.1;
//	char c = 'x';
//	//输入
//	cin >> a; //5
//	cin >> b >> c; //6 a
//	cout << a << endl;	//5
//	cout << b << " " << c << endl;	//6 a
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	// 在io需求⽐较⾼的地⽅，如部分⼤量输⼊的竞赛题中，加上以下3⾏代码
//	// 可以提⾼C++ IO效率
//	ios_base::sync_with_stdio(false);
//	cin.tie(nullptr);
//	cout.tie(nullptr);
//}

//#include <iostream>
//using namespace std;
//
//void Func(int a = 0)
//{
//	cout << a << endl;
//}
//
//int main()
//{
//	Func();		//没有传参是，使用参数的默认值
//	Func(10);	//有传参是，使用指定的实参
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//// 全缺省
//void Func1(int a = 10, int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
//// 半缺省
//void Func2(int a, int b = 10, int c = 20)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//int main()
//{
//	Func1();
//	Func1(1);
//	Func1(1, 2);
//	Func1(1, 2, 3);
//	Func2(100);
//	Func2(100, 200);
//	Func2(100, 200, 300);
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//// 1、参数类型不同
//int Add(int left, int right)
//{
//	cout << "int Add(int left, int right)" << endl;
//	return left + right;
//}
//
//double Add(double left, double right)
//{
//	cout << "double Add(double left, double right)" << endl;
//	return left + right;
//}
//
//// 2、参数个数不同
//void f()
//{
//	cout << "f()" << endl;
//}
//
//void f(int a)
//{
//	cout << "f(int a)" << endl;
//}
//
//// 3、参数类型顺序不同
//void f(int a, char b)
//{
//	cout << "f(int a,char b)" << endl;
//}
//
//void f(char b, int a)
//{
//	cout << "f(char b, int a)" << endl;
//}
//
//int main()
//{
//	Add(10, 20);
//	Add(10.1, 20.2);
//	f();
//	f(10);
//	f(10, 'a');
//	f('a', 10);
//	return 0;
//}

////下⾯两个函数构成重载
//// 但是f()调⽤时，会报错，存在歧义，编译器不知道调⽤谁
//void f1()
//{
//	cout << "f()" << endl;
//}
//void f1(int a=10)
//{
//	cout << "f(int a)" << endl;
//}
//
//int main()
//{
//	f1();	//不知道调用哪一个
//}

//#include <iostream>
//using namespace std;
//
//int main()
//{
//	int a = 0;
//	//引用：b和c是a的别名
//	int& b = a;
//	int& c = a;
//	//也可以给别名b取别名，d相当于还是a的别名
//	int& d = b;
//
//	++d;
//
//	cout << &a << endl;	//0000001D9FAFF5F4
//	cout << &b << endl;	//0000001D9FAFF5F4
//	cout << &c << endl;	//0000001D9FAFF5F4
//	cout << &d << endl;	//0000001D9FAFF5F4
//
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//int main()
//{
//	int a = 0;
//	//编译报错：“ra”:必须初始化引用
//	//int& ra;
//	int& b = a;
//
//	int c = 20;
//	//这里并非让b引用c，因为C++引用不能改变指向
//	//这里是一个赋值
//	b = c;
//
//	cout << &a << endl;	//000000DFB2AFFC24
//	cout << &b << endl;	//000000DFB2AFFC24
//	cout << &c << endl;	//000000DFB2AFFC64
//
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//void Swap(int& rx, int& ry)
//{
//	int tmp = rx;
//	rx = ry;
//	ry = tmp;
//}
//
//void Swap(int* px, int* py)
//{
//	int tmp = *px;
//	*px = *py;
//	*py = tmp;
//}
//
//int main()
//{
//	int x = 0, y = 1;
//	cout << x << " " << y << endl;	//0 1
//	//Swap(&x, &y);
//	Swap(x, y);
//	cout << x << " " << y << endl;	//1 0
//
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//int main()
//{
//	const int a = 10;	//只读
//	int rd = a; //这不是权限的放大，拷贝不存在权限放大，rd可读可写
//	//编译报错：error C2440 : “初始化” :⽆法从“const int”转换为“int&”
//	//这里的引用是对a访问权限的放大
//	//int& ra=a;
//
//	//这样才可以
//	const int& ra = a;
//	//编译报错：error C3892: “ra”: 不能给常量赋值
//	//ra++;
//
//	// 这里的引用是对b访问权限的缩小
//	int b = 20;
//	const int& rb = b;
//	//编译报错：error C3892: “rb”: 不能给常量赋值
//	//rb++
//	//不影响原来的权限
//	b++;
//	cout << rb << endl;	//21
//
//	//临时对象要用const引用
//	//int& rc = 30; //错误的
//	//const引用可以给常量取别名
//	const int& rc = 30;
//
//	//int& rd=(a + b); //错误的
//	const int& rd = (a + b);
//
//	double d = 12.34;
//	int i = d;	
//	//隐式类型转换，中间会产生临时变量来存储(把d的整数拿出来给一个常量存储),所以
//	//int& ri = d;  //是错误的，放大权限了
//	const int& ri = d;
//
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
////正确的宏实现
//#define ADD(a,b) ((a)+(b))
////为什么不能加分号？		会把;替换进去
////为什么要加外面的括号？	控制优先级，避免出现，((1)+(2))*3 变成 (1)+(2)*3 的情况
////为什么要加里面的括号？	控制优先级，比如(x&y+x|y),&和|的优先级没有+高
//int main()
//{
//	int ret = ADD(1, 2); //int ret=((1)+(2));
//	return 0;
//}

//#include <iostream>
//using namespace std;
//
//inline int Add(int x, int y)
//{
//	int ret = x + y;
//	return ret;
//}
//
//int main()
//{
//	int ret = Add(1, 2);
//	cout << ret << endl;
//}

#include<iostream>
using namespace std;

void f(int x)
{
	cout << "f(int x)" << endl;
}

void f(int* ptr)
{
	cout << "f(int* ptr)" << endl;
}

int main()
{
	f(0);	//f(int x)

	// 本想通过f(NULL)调⽤指针版本的f(int*)函数，但是由于NULL被定义成0，调⽤了f(int x)，因此与程序的初衷相悖。
	f(NULL);		//f(int x)
	f((int*)NULL);	//f(int* ptr)

	// 编译报错：error C2665 : “f”: 2个重载中没有⼀个可以转换所有参数类型
	//f((void*)0);	
	//f((void*)NULL);

	f(nullptr);		//f(int* ptr)
	return 0;
}